#include <iostream>
#include <string>
#include <sstream>
#include <memory>
#include <jsoncpp/json/json.h>

class JsonUtil
{
public:
    static bool Serialize(const Json::Value &root, std::string *str){
        Json::StreamWriterBuilder swb;
        std::unique_ptr<Json::StreamWriter> ptr(swb.newStreamWriter());
        std::stringstream ss;
        ptr->write(root, &ss);
        *str = ss.str();
        return true;
    }
    static bool UnSerialize(const std::string &str, Json::Value *root){
        Json::CharReaderBuilder crb;
        std::unique_ptr<Json::CharReader> ptr(crb.newCharReader());
        std::string serr;
        ptr->parse(str.c_str(), str.c_str() + str.size(), &(*root), &serr);

        if(serr.size() != 0){
            std::cout << "UnSerialize err :> " << serr << std::endl;
            return false;
        }
        return true;
    }
};

// int main()
// {
//     Json::Value root;
//     root["姓名"] = "张三";
//     root["年龄"] = 18;
//     root["成绩"].append(22);
//     root["成绩"].append(50);
//     root["成绩"].append(100);

//     std::string str1;
//     JsonUtil json;
//     json.Serialize(root, &str1);

//     std::cout << str1 << std::endl << std::endl;

//     Json::Value tt;
//     json.UnSerialize(str1, &tt);
//     std::cout<<tt["姓名"].asString() << std::endl;
//     std::cout<<tt["年龄"].asInt() << std::endl;
//     for(int i = 0; i < tt["成绩"].size(); i++){
//         std::cout << tt["成绩"][i].asInt();
//         std::cout << std::endl;
//     }
//     printf("\n");
// }